The main crate of the swc project.
# Customizing
This is documentation for building custom build tools on top of swc.
## Dependency version management
`swc` has [swc_ecmascript](https://docs.rs/swc_ecmascript) and [swc_css](https://docs.rs/swc_css), which re-exports required modules.
## Testing
See [testing] and [swc_ecma_transform_testing](https://docs.rs/swc_ecmc_transform_testing).
## Custom javascript transforms
### What is [JsWord](swc_atoms::JsWord)?
It's basically an interned string. See [swc_atoms].
### Choosing between [JsWord](swc_atoms::JsWord) vs String
You should prefer [JsWord](swc_atoms::JsWord) over [String] if it's going
to be stored in an AST node.
See [swc_atoms] for detailed description.
### Fold vs VisitMut vs Visit
See [swc_visit] for detailed description.
- [Fold](swc_ecma_visit::Fold)
- [VisitMut](swc_ecma_visit::VisitMut)
- [Visit](swc_ecma_visit::Visit)
### Variable management (Scoping)
See [swc_ecma_transforms_base::resolver::resolver_with_mark].
#### How identifiers work
See the doc on [swc_ecma_ast::Ident] or on
[swc_ecma_transforms_base::resolver::resolver_with_mark].
#### Comparing two identifiers
See [swc_ecma_utils::Id]. You can use [swc_ecma_utils::IdentLike::to_id] to
extract important parts of an [swc_ecma_ast::Ident].
#### Creating a unique identifier
See [swc_ecma_utils::private_ident].
#### Prepending statements
If you want to prepend statements to the beginning of a file, you can use
[swc_ecma_utils::prepend_stmts] or [swc_ecma_utils::prepend] if `len == 1`.
These methods are aware of the fact that `"use strict"` directive should be
first in a file, and insert statements after directives.
### Improving readability
Each stuffs are documented at itself.
- If you are creating or binding an [swc_ecma_ast::Expr] with operator, you
can use [swc_ecma_ast::op].
- If you want to create [swc_ecma_ast::CallExpr], you can use
[swc_ecma_utils::ExprFactory::as_callee] to create `callee`.
- If you want to create [swc_ecma_ast::CallExpr] or
[swc_ecma_ast::NewExpr], you can use
[swc_ecma_utils::ExprFactory::as_arg] to create arguments.
- If you want to create [swc_ecma_ast::MemberExpr] where all identifiers
are static (e.g. `Object.prototype.hasOwnProperty`), you can use
[swc_ecma_utils::member_expr].
- If you want to create [swc_ecma_ast::MemberExpr], you can use
[swc_ecma_utils::ExprFactory::as_obj] to create object field.
### Reducing binary size
The visitor expands to a lot of code. You can reduce it by using macros like
- [noop_fold_type](swc_ecma_visit::noop_fold_type)
- [noop_visit_mut_type](swc_ecma_visit::noop_visit_mut_type)
- [noop_visit_type](swc_ecma_visit::noop_visit_type)
Note that this will make typescript-related nodes not processed, but it's
typically fine as `typescript::strip` is invoked at the start and it removes
typescript-specific nodes.
### Porting `expr.evaluate()` of babel
See [swc_ecma_minifier::eval::Evaluator].